import cv2
import numpy as np


# 直方图绘制函数
def draw_hist(image, color):
    hist = cv2.calcHist(
        [image],  # 计算直方图的图像，支持多图像输入，因此一个图像也要写成列表
        [0],  # 要计算的图像灰度值通道需要，灰度图直接传0
        None,  # 掩膜，全图计算不需要
        [256],  # 直方图x轴的精细程度，256表示分为256份
        [0, 255]  # x轴的范围
    )
    # 提取关键数据
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)

    # 创建一张纯黑图，画柱子
    hist_img = np.zeros([256, 256, 3], np.uint8)
    # 为了让y轴最高的柱子留一部门空白，最高柱子的高度
    hpt = int(256 * 0.9)
    for h in range(256):  # 从0到255，每个灰度画柱子
        # 柱子高度（整数） = 直方图的最高值hpt * 每个灰度的频数/最高的频数
        intensity = int(hpt * hist[h] / max_val)
        # 画柱子（线）
        cv2.line(
            hist_img,
            (h, 256),  # x轴的起始点
            (h, 256 - intensity),  # 线段从下往上画的终点
            color
        )
    return hist_img


if __name__ == '__main__':
    # 1. 图片输入
    image_np = cv2.imread("C:\\Users\\20436\Desktop\haoduokun.jpg")



    # 3. 模板输入
    template = cv2.imread("C:\\Users\\20436\Desktop\qiu.jpg")
    h = template.shape[0]
    w = template.shape[1]

    # 5. 模板匹配
    res = cv2.matchTemplate(
        image_np,  # 原始图像
        template,  # 模板
        cv2.TM_CCOEFF_NORMED  # 归一化相关系数匹配
    )

    # 设定阈值（大值）
    threshold = 0.89

    # 小于阈值的就是匹配成功
    loc = np.where(res >threshold)


    # 6. 绘制轮廓
    for x, y in zip(loc[1], loc[0]):
        # 画框
        cv2.rectangle(
            image_np,
            (x, y),
            (x + w, y + h),  # 右下角是左上角加上模板的宽高
            (0, 0, 255),
            thickness=2
        )

    # 7. 图片输出
    cv2.imshow('image_np', image_np)
    cv2.imwrite('contour_image.jpg',image_np)
    cv2.waitKey(0)
